package org.wdcode.common.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;

import org.wdcode.common.constants.EncodingConstants;
import org.wdcode.common.constants.StringConstants;
import org.wdcode.common.exception.CustomRuntimeException;
import org.wdcode.common.util.StringUtil;

/**
 * 对文件进行一些处理。
 * @author WD
 * @since JDK6
 * @version 1.0 2009-03-01
 */
public final class FileUtil {
	/**
	 * 创建目录
	 * @param path 目录路径
	 * @return true 成功 false 失败
	 */
	public final static boolean createPath(String path) {
		return path.indexOf(StringConstants.POINT) == -1 ? getFile(path).mkdirs() : getFile(StringUtil.subStringLastEnd(path, StringConstants.DIAGONAL)).mkdirs();
	}

	/**
	 * 创建目录
	 * @param file 文件
	 * @return true 成功 false 失败
	 */
	public final static boolean createPath(File file) {
		return file.exists() ? false : createPath(file.getPath());
	}

	/**
	 * 删除文件
	 * @param fileName 文件名
	 * @return true 成功 false 失败
	 */
	public final static boolean delete(String fileName) {
		return delete(getFile(fileName));
	}

	/**
	 * 删除文件
	 * @param file 文件名
	 * @return true 成功 false 失败
	 */
	public final static boolean delete(File file) {
		return file.delete();
	}

	/**
	 * 复制文件
	 * @param src 原文件
	 * @param target 目标文件
	 */
	public final static boolean copy(String src, String target) {
		return write(target, getInputStream(src));
	}

	/**
	 * 复制文件
	 * @param src 原文件
	 * @param target 目标文件
	 */
	public final static boolean copy(File src, File target) {
		return StreamUtil.write(getOutputStream(target), getInputStream(src));
	}

	/**
	 * 读取文件 默认使用UTF-8编码
	 * @param fileName 要读取的文件
	 * @return String 读取出的字符串
	 */
	public final static String readString(String fileName) {
		return readString(fileName, EncodingConstants.UTF_8);
	}

	/**
	 * 读取文件
	 * @param fileName 要读取的文件
	 * @param charsetName 编码格式
	 * @return 读取文件的内容
	 */
	public final static String readString(String fileName, String charsetName) {
		return StreamUtil.readString(getInputStream(fileName), charsetName);
	}

	/**
	 * 读取文件
	 * @param fileName 要读取的文件
	 * @return 读取文件字节数组
	 */
	public final static byte[] read(String fileName) {
		return StreamUtil.read(getInputStream(fileName));
	}

	/**
	 * 读取文件
	 * @param file 要读取的文件
	 * @return 读取文件字节数组
	 */
	public final static byte[] read(File file) {
		return StreamUtil.read(getInputStream(file));
	}

	/**
	 * 把InputStream流中的内容保存到文件中
	 * @param fileName 文件名
	 * @param is 流
	 * @return true 成功 false 失败
	 */
	public final static boolean write(String fileName, InputStream is) {
		return StreamUtil.write(getOutputStream(fileName), is);
	}

	/**
	 * 把文件写指定路径中
	 * @param fileName 文件名
	 * @param file 文件
	 * @return true 成功 false 失败
	 */
	public final static boolean write(String fileName, File file) {
		return StreamUtil.write(getOutputStream(fileName), getInputStream(file));
	}

	/**
	 * 把文件写指定路径中
	 * @param fileName 文件名
	 * @param file 文件
	 * @return true 成功 false 失败
	 */
	public final static boolean write(String fileName, byte[] b) {
		return StreamUtil.write(getOutputStream(fileName), b);
	}

	/**
	 * 写文件 默认使用UTF-8编码
	 * @param text 写入的内容
	 * @param fileName 文件名
	 * @return true false
	 */
	public final static boolean writeString(String fileName, String text) {
		return writeString(fileName, text, EncodingConstants.UTF_8);
	}

	/**
	 * 写文件
	 * @param text 写入的内容
	 * @param fileName 文件名
	 * @param charsetName 编码格式
	 * @return true false
	 */
	public final static boolean writeString(String fileName, String text, String charsetName) {
		return StreamUtil.writeString(getOutputStream(fileName), text, charsetName);
	}

	/**
	 * 获得文件
	 * @param fileName 文件名含路径
	 * @return File对象
	 */
	public final static File getFile(String fileName) {
		return new File(fileName);
	}

	/**
	 * 获得文件输入流 如果失败返回null
	 * @param fileName 文件名
	 * @return 输入流
	 */
	public final static FileInputStream getInputStream(String fileName) {
		return getInputStream(getFile(fileName));
	}

	/**
	 * 获得文件输出流 如果失败返回null
	 * @param fileName 文件名
	 * @return 输出流
	 */
	public final static FileOutputStream getOutputStream(String fileName) {
		return getOutputStream(getFile(fileName));
	}

	/**
	 * 获得文件输入流 如果失败返回null
	 * @param file 文件
	 * @return 输入流
	 */
	public final static FileInputStream getInputStream(File file) {
		try {
			return new FileInputStream(file);
		} catch (FileNotFoundException e) {
			throw new CustomRuntimeException(e);
		}
	}

	/**
	 * 获得文件输出流 如果失败返回null
	 * @param file 文件
	 * @return 输出流
	 */
	public final static FileOutputStream getOutputStream(File file) {
		try {
			createPath(file);
			return new FileOutputStream(file);
		} catch (FileNotFoundException e) {
			throw new CustomRuntimeException(e);
		}
	}

	/**
	 * 私有构造禁止外部实例化
	 */
	private FileUtil() {}
}
